#include "Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h" // Device header
#include "stm32f4xx_conf.h"
#include "Key.h"
#include "Timer.h"

#define KEY_PRESSED				1
#define KEY_UNPRESSED			0

#define KEY_TIME_DOUBLE			200
#define KEY_TIME_LONG			2000
#define KEY_TIME_REPEAT			100

uint8_t Key_Flag[KEY_COUNT];
/**
  * @brief  按键初始化（包含定时器）
  * @param  无
  * @retval 无
  */
void Key_Init(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	TIM3_Init();//定时器初始化
}
/**
  * @brief  按键状态判断
  * @param  按键编号
  * @retval 按键状态
  */
uint8_t Key_GetState(uint8_t n)
{
	if (n == KEY_1)
	{
		if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 1)
		{
			return KEY_PRESSED;
		}
	}
	else if (n == KEY_2)
	{
		if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 1)
		{
			return KEY_PRESSED;
		}
	}
	else if (n == KEY_3)
	{
		if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 1)
		{
			return KEY_PRESSED;
		}
	}
	
	return KEY_UNPRESSED;
}
/**
  * @brief  按键状态检测
  * @param  按键编号，按键状态
  * @retval 
  */
uint8_t Key_Check(uint8_t n, uint8_t Flag)
{
	if (Key_Flag[n] & Flag)
	{
		if (Flag != KEY_HOLD)
		{
			Key_Flag[n] &= ~Flag;
		}
		return 1;
	}
	return 0;
}

void Key_Tick(void)
{
	static uint8_t Count, i;
	static uint8_t CurrState[KEY_COUNT], PrevState[KEY_COUNT];
	static uint8_t S[KEY_COUNT];
	static uint16_t Time[KEY_COUNT];
	
	for (i = 0; i < KEY_COUNT; i ++)
	{
		if (Time[i] > 0)
		{
			Time[i] --;
		}
	}
	
	Count ++;
	if (Count >= 20)
	{
		Count = 0;
		
		for (i = 0; i < KEY_COUNT; i ++)
		{
			PrevState[i] = CurrState[i];
			CurrState[i] = Key_GetState(i);
			
			if (CurrState[i] == KEY_PRESSED)
			{
				Key_Flag[i] |= KEY_HOLD;
			}
			else
			{
				Key_Flag[i] &= ~KEY_HOLD;
			}
			
			if (CurrState[i] == KEY_PRESSED && PrevState[i] == KEY_UNPRESSED)
			{
				Key_Flag[i] |= KEY_DOWN;
			}
			
			if (CurrState[i] == KEY_UNPRESSED && PrevState[i] == KEY_PRESSED)
			{
				Key_Flag[i] |= KEY_UP;
			}
			
			if (S[i] == 0)
			{
				if (CurrState[i] == KEY_PRESSED)
				{
					Time[i] = KEY_TIME_LONG;
					S[i] = 1;
				}
			}
			else if (S[i] == 1)
			{
				if (CurrState[i] == KEY_UNPRESSED)
				{
					Time[i] = KEY_TIME_DOUBLE;
					S[i] = 2;
				}
				else if (Time[i] == 0)
				{
					Time[i] = KEY_TIME_REPEAT;
					Key_Flag[i] |= KEY_LONG;
					S[i] = 4;
				}
			}
			else if (S[i] == 2)
			{
				if (CurrState[i] == KEY_PRESSED)
				{
					Key_Flag[i] |= KEY_DOUBLE;
					S[i] = 3;
				}
				else if (Time[i] == 0)
				{
					Key_Flag[i] |= KEY_SINGLE;
					S[i] = 0;
				}
			}
			else if (S[i] == 3)
			{
				if (CurrState[i] == KEY_UNPRESSED)
				{
					S[i] = 0;
				}
			}
			else if (S[i] == 4)
			{
				if (CurrState[i] == KEY_UNPRESSED)
				{
					S[i] = 0;
				}
				else if (Time[i] == 0)
				{
					Time[i] = KEY_TIME_REPEAT;
					Key_Flag[i] |= KEY_REPEAT;
					S[i] = 4;
				}
			}
		}
	}
}
//使用示例（初始化按键）
//以下内容放while中
/*示例1(长按检测)*/
//		if (Key_Check(KEY_1, KEY_HOLD))
//		{
//			Num1 = 1;
//		}
//		else
//		{
//			Num1 = 0;
//		}
//		if (Key_Check(KEY_2, KEY_HOLD))
//		{
//			Num2 = 1;
//		}
//		else
//		{
//			Num2 = 0;
//		}
		
		/*示例2（按下抬起检测）*/
//		if (Key_Check(KEY_1, KEY_DOWN))
//		{
//			Num1 ++;
//		}
//		if (Key_Check(KEY_2, KEY_UP))
//		{
//			Num2 ++;
//		}
		
		/*示例3（单击、双击、长按）*/
//		if (Key_Check(KEY_1, KEY_SINGLE))
//		{
//			Num1 ++;
//		}
//		if (Key_Check(KEY_1, KEY_DOUBLE))
//		{
//			Num1 += 100;
//		}
//		if (Key_Check(KEY_2, KEY_SINGLE))
//		{
//			Num1 --;
//		}
//		if (Key_Check(KEY_2, KEY_DOUBLE))
//		{
//			Num1 -= 100;
//		}
//		if (Key_Check(KEY_1, KEY_LONG) || Key_Check(KEY_2, KEY_LONG))
//		{
//			Num1 = 0;
//		}
		
		/*示例4（长按定值）*/
//		if (Key_Check(KEY_1, KEY_SINGLE) || Key_Check(KEY_1, KEY_REPEAT))
//		{
//			Num1 ++;
//		}
//		if (Key_Check(KEY_2, KEY_SINGLE) || Key_Check(KEY_2, KEY_REPEAT))
//		{
//			Num1 --;
//		}
//		if (Key_Check(KEY_3, KEY_SINGLE))
//		{
//			Num1 = 0;
//		}
//		if (Key_Check(KEY_3, KEY_LONG))
//		{
//			Num1 = 9999;
//		}
		
		/*示例5（功能键、多键共同起作用）*/
//		uint8_t K1_UP = Key_Check(KEY_1, KEY_UP);
//		uint8_t K2_UP = Key_Check(KEY_2, KEY_UP);
//		
//		if (K1_UP && Key_Check(KEY_3, KEY_HOLD))
//		{
//			Num1 ++;
//		}
//		if (K2_UP && Key_Check(KEY_3, KEY_HOLD))
//		{
//			Num1 --;
//		}
